From: Carlos Garnacho Date: Thu, 14 Nov 2019 22:56:42 +0000 (+0100) Subject: windowManager: Implement MetaDisplay::init-xserver hook X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~772^2^2~4 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=12e14884efbe09cd90444c98701e6444a68cbb32;p=gnome-shell.git windowManager: Implement MetaDisplay::init-xserver hook We do spawn gsd-xsettings, and watch its name before notifying on the given task, so the mutter bits can proceed with X11 startup. One notable change is that we only start gsd-xsettings, instead of the generic gnome-session-x11-services target. We do so as we have to wait on a dbus name to appear in order to deem the initialization done, and making it all depend on gsd-xsettings seems tidier. Less notably, we also use ::shutdown-xserver to shutdown the related services. Its major benefit is that it'd allow us to ensure the olderly shutdown of those services, but it's unused at the moment. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/836 --- diff --git a/js/ui/windowManager.js b/js/ui/windowManager.js index 53f184561..d02d2e183 100644 --- a/js/ui/windowManager.js +++ b/js/ui/windowManager.js @@ -896,13 +896,36 @@ var WindowManager = class { } }); - global.display.connect('x11-display-opened', () => { + global.display.connect('init-xserver', (display, task) => { IBusManager.getIBusManager().restartDaemon(['--xim']); - Shell.util_start_systemd_unit('gnome-session-x11-services.target', 'fail'); + Shell.util_start_systemd_unit('gsd-xsettings.target', 'fail'); + + /* Leave this watchdog timeout so don't block indefinitely here */ + let timeoutId = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 5, () => { + Gio.DBus.session.unwatch_name(watchId); + task.return_boolean(false); + timeoutId = 0; + return GLib.SOURCE_REMOVE; + }); + + /* When gsd-xsettings daemon is started, we are good to resume */ + let watchId = Gio.DBus.session.watch_name( + 'org.gnome.SettingsDaemon.XSettings', + Gio.BusNameWatcherFlags.NONE, + () => { + Gio.DBus.session.unwatch_name(watchId); + if (timeoutId > 0) { + task.return_boolean(true); + GLib.source_remove(timeoutId); + } + }, + null); + return true; }); - global.display.connect('x11-display-closing', () => { - Shell.util_stop_systemd_unit('gnome-session-x11-services.target', 'fail'); + global.display.connect('shutdown-xserver', (display, task) => { + Shell.util_stop_systemd_unit('gsd-xsettings.target', 'fail'); IBusManager.getIBusManager().restartDaemon(); + task.return_boolean(true); }); Main.overview.connect('showing', () => {